#if !defined(_APP_DEVICE_H)
#define _APP_DEVICE_H
#include "app_message.h"
#include "app_buffer.h"
#include <pthread.h>


/**
 * 通用设备结构体
 */
typedef struct {
    char *dev_filename; //设备文件名 
    int  fd ;// 设备文件描述符
    Buffer *up_buffer;//上行缓冲区
    Buffer *down_buffer;//下行缓冲区
    int (*post_read)(char *read_data,int read_data_size);//读后预处理 在确定了连接类型的时候  由对应连接模块进行装配
    int (*pre_write)(char *write_data,int write_data_size);//写前预处理 在确定了连接类型的时候 由对应连接模块进行装配
    pthread_t read_thread; //读芯片数据线程
    int  is_running; //运行状态
    long long last_write_ts_ms; //上次写时间戳
    long interval_ms; //默认200ms 

}device_t;

/**
 * 初始化设备结构体
 */
device_t *app_device_init(char *dev_filename);

/**
 * 启动设备运行 ，开始读取芯片数据的线程 ，执行（从芯片中读取数据到上行缓冲区）
 */
int app_device_start();

/**
 * 从芯片中读取数据到上行缓冲区 （异步）
 */
void *app_device_read(void *arg);

/**
 * 从上行缓冲区中读取数据到消息队列 (交给线程池执行 异步方法)
 */
int app_device_send_to_mqtt(void *arg);

/**
 * 接收路由模块接收消息后 传递给设备模块
 */
int app_device_recv_from_mqtt(char *json, int len);

/**
 * 从设备模块的a下行缓冲区 写入芯片中 （异步 由线程池执行）
 */
int app_device_write(void *arg);

/**
 * 销毁设备结构体
 */
void  app_device_destroy();

#endif // _APP_DEVICE_H